package com.letao.server.controller;


import cn.hutool.core.bean.BeanUtil;
import com.letao.server.dto.*;
import com.letao.server.entity.*;
import com.letao.server.service.*;
import com.letao.server.utils.UserHolderUtils;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 用户模块控制类
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    private IUserService userService;

    @Resource
    private IUserAddressService userAddressService;

    @Resource
    private IUserCartService userCartService;

    @Resource
    private ISkuService skuService;

    @Resource
    private ISpuService spuService;

    /**
     * 普通注册接口
     * 接口等级: 访客
     *
     * @param userInfo 用户数据
     * @return Result 返回结果
     */
    @PostMapping("/register")
    private Result register(@RequestBody UserInfo userInfo) {
        userInfo.setId(null);
        userInfo.setCreateTime(null);
        userInfo.setModifiedTime(null);
        userInfo.setUserImage(null);
        if (userInfo.getAccount() == null || userInfo.getPassword() == null || userInfo.getPhoneNumber() == null) {
            return Result.fail("信息缺失");
        }
        return userService.register(userInfo);
    }

    /**
     * 普通登录接口
     * 接口等级: 访客
     *
     * @param loginForm 用户信息
     * @return Result 返回结果
     */
    @PostMapping("/login")
    private Result login(@RequestBody UserLoginFormDTO loginForm, HttpServletRequest request) {
        return userService.login(loginForm, request);
    }

    /**
     * 用于获取手机验证码
     * 接口等级: 访客
     *
     * @param phoneNumber 用户手机号
     * @return Result 返回结果
     */
    @GetMapping("/code")
    private Result sendCode(@RequestParam("phoneNumber") String phoneNumber) {
        return userService.sendCode(phoneNumber);
    }

    /**
     * 用于手机验证码登录/注册
     * 接口等级: 访客
     *
     * @param loginForm 验证信息
     * @return Result 返回结果
     */
    @PostMapping("/mlogin")
    private Result mlogin(@RequestBody UserLoginFormDTO loginForm) {
        log.debug("{}", loginForm);
        return userService.mlogin(loginForm);
    }

    /**
     * 用户信息更新接口
     * 接口等级: 用户
     *
     * @return Result 返回结果
     */
    @PutMapping()
    private Result update(
            @RequestParam(required = false) String account,
            @RequestParam(required = false) Integer sex,
            @RequestParam(required = false) String email) {
        // 洗去异常数据
        UserInfo userInfo = new UserInfo();
        if (account != null)
            userInfo.setAccount(account);
        if (sex != null)
            userInfo.setSex(sex);
        if (email != null)
            userInfo.setEmail(email);
        return userService.updateUser(userInfo);

    }

    @PutMapping("/update")
    private Result updateUser(@RequestBody UserInfo userInfo) {
        if (userInfo.getAccount() == null || userInfo.getSex() == null || userInfo.getEmail() == null) {
            return Result.fail("数据不完整");
        }
        userInfo.setId(UserHolderUtils.getUser().getId());
        userInfo.setUserImage(null);
        userInfo.setCreateTime(null);
        userInfo.setModifiedTime(null);
        userInfo.setPhoneNumber(null);
        userInfo.setPassword(null);
        userService.updateById(userInfo);
        return Result.success();
    }

    /**
     * 查询个人信息,不包含敏感信息
     * 接口等级: 用户
     *
     * @return Result 返回结果
     */
    @GetMapping
    private Result meInfo() {

        // 获取用户简要信息
        UserInfoDTO user = UserHolderUtils.getUser();
        UserInfo id = userService.getById(user.getId());
        UserInfoDTO userInfoDTO = BeanUtil.copyProperties(id, UserInfoDTO.class);
        log.info("ID = {}的用户查询了个人信息", user.getId());
        return Result.success(userInfoDTO);
    }

    /**
     * 修改密码, 要求新旧密码不同
     * 接口等级: 用户
     *
     * @param password 密码数据
     * @return Result 返回结果
     */
    @PutMapping("/password")
    private Result changePassword(@RequestBody PasswordChangeDTO password) {
        if (password.getPasswordNew() == null) {
            return Result.fail("请求错误");
        }
        return userService.changePassword(password);
    }

    /**
     * 用于有条件的分页批量查询用户信息
     * 接口等级: 管理员
     *
     * @param name     模糊查询用户名的条件
     * @param sex      用户性别条件
     * @param begin    用户创建时间段起始时间
     * @param end      用户创建时间段结束时间
     * @param page     查询页码
     * @param pageSize 查询页的大小
     * @return Result 返回的数据
     */
    @GetMapping("/users")
    private Result queryUsers(@RequestParam(required = false) String name,
                              @RequestParam(required = false) Integer sex,
                              @RequestParam(required = false) String begin,
                              @RequestParam(required = false) String end,
                              @RequestParam(required = false, defaultValue = "1") Integer page,
                              @RequestParam(required = false, defaultValue = "10") Integer pageSize) {
        return userService.getPageInfo(name, sex, begin, end, page, pageSize);
    }

    @GetMapping("/user/{id}")
    private Result queryUser(@PathVariable String id) {
        UserInfo user = userService.getById(id);
        return Result.success(user);
    }

    /**
     * 增加用户的地址
     * 接口等级: 用户
     *
     * @param address 地址信息
     * @return 返回的结果
     */
    @PostMapping("/address")
    private Result insertAddress(@RequestBody UserAddress address) {
        return userAddressService.insert(address);
    }

    /**
     * 修改用户的地址信息
     * 接口等级: 用户
     *
     * @param address 地址信息
     * @return 返回的结果
     */
    @PutMapping("/address")
    private Result updateAddress(@RequestBody UserAddress address) {
        return userAddressService.update(address);
    }

    /**
     * 获取用户的地址集合
     * 接口等级: 用户
     *
     * @return 返回的结果
     */
    @GetMapping("/address")
    private Result queryAddress() {
        return userAddressService.queryAddress();
    }

    /**
     * 增加用户购物车词条
     * 接口等级: 用户
     *
     * @param info 词条信息
     * @return 返回的结果
     */
    @PostMapping("/cart")
    private Result addCart(@RequestBody UserCartInfo info) {
        log.debug("{}", info);
        if (info.getSkuId() == null || info.getNumber() == null) {
            return Result.fail("数据不完整");
        }
        SkuInfo sku = skuService.getById(info.getSkuId());
        if (sku == null) {
            return Result.fail("依赖不存在");
        }
        UserCartInfo one = userCartService.query()
                .eq("sku_id", info.getSkuId())
                .eq("user_id", UserHolderUtils.getUser().getId())
                .eq("is_order", 0)
                .one();
        if (one != null) {
            one.setNumber(one.getNumber() + info.getNumber());
            userCartService.updateById(one);
            return Result.success();
        }
        info.setCartPrice(sku.getPrice());
        info.setSkuName(sku.getSkuName());
        info.setUserId(UserHolderUtils.getUser().getId());
        info.setSpuId(sku.getSpuId());
        info.setId(null);
        info.setCreateTime(null);
        info.setModifiedTime(null);
        info.setIsOrder(null);
        userCartService.save(info);
        return Result.success();
    }

    /**
     * 修改用户购物车词条
     * 接口等级: 用户
     *
     * @param info 词条信息
     * @return 返回的结果
     */
    @PutMapping("/cart")
    private Result updateCart(@RequestBody UserCartInfo info) {
        log.debug("{}", info);
        if (info.getId() == null && info.getSkuId() == null) {
            return Result.fail("数据不完整");
        }
        UserCartInfo cart;
        if (info.getId() != null) cart = userCartService.getById(info.getId());
        else cart = userCartService.query()
                .eq("sku_id", info.getSkuId())
                .eq("user_id", UserHolderUtils.getUser().getId())
                .eq("is_order", 0)
                .one();
        if (cart == null) {
            return Result.fail("购物车词条不存在或已经结算!");
        }
        if (info.getSkuId() != null && !info.getSkuId().equals(cart.getSkuId())) {
            SkuInfo sku = skuService.getById(info.getSkuId());
            if (!Objects.equals(sku.getSpuId(), cart.getSpuId())) {
                return Result.fail("请新增而不是修改");
            }
            cart.setSkuId(info.getSkuId());
            cart.setSkuName(info.getSkuName());
        }
        cart.setNumber(info.getNumber());
        userCartService.updateById(cart);
        log.debug("{}", info);
        return Result.success();
    }

    /**
     * 用户查询购物车词条
     * 接口等级: 用户
     *
     * @return 返回的结果
     */
    @GetMapping("/cart")
    private Result queryCart() {
        Long userId = UserHolderUtils.getUser().getId();
        List<UserCartInfo> list = userCartService.query()
                .eq("user_id", userId)
                .eq("is_order", 0)
                .orderByDesc("create_time").list();
        List<UserCartDTO> ulist = new ArrayList<>();
        for (UserCartInfo info : list) {
            UserCartDTO userCartDTO = BeanUtil.copyProperties(info, UserCartDTO.class);
            SkuInfo sku = skuService.getById(info.getSkuId());
            SpuInfo spu = spuService.getById(info.getSpuId());
            if (sku.getHasImage() != null) userCartDTO.setSkuImage(sku.getHasImage());
            else userCartDTO.setSkuImage(spu.getSpuImage());
            userCartDTO.setSpuName(spu.getSpuName());
            userCartDTO.setDescript(sku.getDescript());
            ulist.add(userCartDTO);
        }
        return Result.success(ulist);
    }

    /**
     * 批量结算购物车
     * 接口等级: 用户
     *
     * @param orderList 需要结算的购物车词条Id列表
     * @return 返回的结果
     */
    @PutMapping("/cart/order")
    private Result orderCart(@RequestBody OrderListDTO orderList) {
        List<UserCartInfo> list = new ArrayList<>();
        for (Long id : orderList.getOrderList()) {
            UserCartInfo info = userCartService.getById(id);
            if (info == null) {
                return Result.fail("依赖不完整");
            }
            if (info.getIsOrder() == 1) {
                return Result.fail("重复结算");
            }
            list.add(info);
        }

        return userCartService.cartOrderInfo(list);
    }

    /**
     * 删除购物车词条
     * 接口等级: 用户
     *
     * @param id 需要删除的购物车的词条Id
     * @return 返回的结果
     */
    @DeleteMapping("/cart/{id}")
    private Result deleteCart(@PathVariable("id") Long id) {
        UserCartInfo info = userCartService.getById(id);
        if (info == null) return Result.fail("对象不存在");
        userCartService.removeById(id);
        return Result.success();
    }

    @DeleteMapping("/cart")
    private Result deleteCartNew(@RequestParam Long skuId) {
        UserCartInfo one = userCartService.query()
                .eq("user_id", UserHolderUtils.getUser().getId())
                .eq("sku_id", skuId)
                .eq("is_order", 0)
                .one();
        if (one == null) {
            return Result.fail("对象不存在");
        }
        userCartService.removeById(one.getId());
        return Result.success();
    }

}
